"""
lightOS 自动化配置工具 主程序

功能概述:
- GUI界面：使用tkinter构建配置管理界面
- 配置管理：支持多工作表的Excel配置文件
- 文件操作：支持加载、保存Excel配置文件
- 代码生成：可生成C语言头文件

模块结构:
- config_manager.py: 配置数据管理
- file_handler.py: 文件I/O操作
- code_generator.py: C代码生成
- ui_components.py: UI组件管理
- main.py: 主应用程序

作者: lightOS Team
版本: 1.0.1
"""

import tkinter as tk
from tkinter import messagebox
import os

from config_manager import ConfigManager
from file_handler import FileHandler
from code_generator import CodeGenerator
from ui_components import UIManager


class CConfigGUI:
    """lightOS配置工具主应用程序"""
    
    def __init__(self, root):
        """
        初始化应用程序
        
        参数:
            root: tkinter根窗口
        """
        self.root = root
        
        # 初始化管理器
        self.config_mgr = ConfigManager()
        self.ui_mgr = UIManager(root)
        self.file_handler = FileHandler()
        self.code_gen = CodeGenerator()
        
        # 设置窗口
        self.ui_mgr.setup_window()
        self.ui_mgr.setup_styles()
        
        # 创建UI
        self._create_ui()
        
        # 自动加载默认配置
        self.auto_load_default_config()
    
    def _create_ui(self):
        """创建应用程序UI"""
        # 创建标题栏
        self.ui_mgr.create_title_bar()
        
        # 创建主框架
        self.main_frame = self.ui_mgr.create_main_frame()
        
        # 创建标签页控件
        self.notebook = self.ui_mgr.create_notebook(self.main_frame)
        
        # 创建底部按钮
        self._create_bottom_buttons()
        
        # 创建版本号标签
        self.ui_mgr.create_version_label(self.main_frame)
    
    def _create_bottom_buttons(self):
        """创建底部按钮栏"""
        buttons_config = [
            {"text": "保存配置", "command": self.save_config, "position": "left"},
            {"text": "加载配置", "command": self.load_config, "position": "left"},
            {"text": "清空配置", "command": self.clear_config, "position": "left"},
            {"text": "添加配置项", "command": self.add_current_config_entry, "position": "left"},
            {"text": "生成代码", "command": self.generate_c_header, "position": "right"},
        ]
        
        self.ui_mgr.create_bottom_buttons(self.main_frame, buttons_config)
    
    # ========================
    # 工作表管理相关方法
    # ========================
    
    def add_sheet(self, sheet_name):
        """
        添加一个新的工作表标签页
        
        参数:
            sheet_name (str): 工作表名称
        """
        if sheet_name in self.config_mgr.sheet_frames:
            return  # 工作表已存在
        
        # 创建标签页框架
        sheet_frame = self.ui_mgr.create_sheet_tab(self.notebook, sheet_name)
        
        # 创建标题部分
        self.ui_mgr.create_title_section(sheet_frame)
        
        # 创建可滚动的配置区域
        config_canvas, config_scrollbar, scrollable_frame = \
            self.ui_mgr.create_scrollable_frame(sheet_frame)
        
        # 保存框架引用
        self.config_mgr.sheet_frames[sheet_name] = {
            'frame': sheet_frame,
            'canvas': config_canvas,
            'scrollbar': config_scrollbar,
            'scrollable_frame': scrollable_frame
        }
        
        # 初始化该工作表的数据存储
        self.config_mgr.add_sheet(sheet_name)
    
    def remove_sheet(self, sheet_name):
        """
        删除一个工作表标签页
        
        参数:
            sheet_name (str): 工作表名称
        """
        if sheet_name not in self.config_mgr.sheet_frames:
            return
        
        # 找到并删除标签页
        for tab_id in self.notebook.tabs():
            if self.notebook.tab(tab_id, "text") == sheet_name:
                self.notebook.forget(tab_id)
                break
        
        # 删除数据
        del self.config_mgr.sheet_frames[sheet_name]
        self.config_mgr.remove_sheet(sheet_name)
    
    def clear_all_sheets(self):
        """清空所有工作表"""
        sheet_names = list(self.config_mgr.sheet_frames.keys())
        for sheet_name in sheet_names:
            self.remove_sheet(sheet_name)
    
    # ========================
    # 配置项管理相关方法
    # ========================
    
    def add_config_entry(self, sheet_name=None, name="", value=""):
        """
        添加一个配置项输入框
        
        参数:
            sheet_name (str): 工作表名称，None则使用当前活跃标签页
            name (str): 配置项名称
            value (str): 配置项值
        """
        # 获取工作表名称
        if sheet_name is None:
            current_tab_id = self.notebook.select()
            if current_tab_id:
                sheet_name = self.notebook.tab(current_tab_id, "text")
            else:
                messagebox.showwarning("警告", "没有可用的工作表")
                return
        
        # 检查工作表是否存在
        if sheet_name not in self.config_mgr.sheet_frames:
            messagebox.showwarning("警告", f"工作表 '{sheet_name}' 不存在")
            return
        
        # 获取滚动框架
        scrollable_frame = self.config_mgr.sheet_frames[sheet_name]['scrollable_frame']
        
        # 创建配置项输入框
        frame, name_entry, value_entry = \
            self.ui_mgr.create_config_entry_row(scrollable_frame, name, value)
        
        # 创建删除按钮
        self.ui_mgr.create_delete_button(
            frame, 
            text="删除",
            command=lambda f=frame: self.remove_config_entry(f, sheet_name)
        )
        
        # 绑定事件：内容变化时更新配置数据
        name_entry.bind("<FocusOut>", lambda e: self.config_mgr.update_config_data())
        value_entry.bind("<FocusOut>", lambda e: self.config_mgr.update_config_data())
        
        # 保存配置项引用
        self.config_mgr.add_config_entry(sheet_name, name_entry, value_entry)
    
    def remove_config_entry(self, frame, sheet_name):
        """
        删除一个配置项
        
        参数:
            frame: 配置项框架
            sheet_name (str): 工作表名称
        """
        # 从列表中删除引用
        entries_to_remove = []
        for entry in self.config_mgr.sheet_entries[sheet_name]:
            if hasattr(entry, "frame") and entry["frame"] == frame:
                entries_to_remove.append(entry)
        
        for entry in entries_to_remove:
            self.config_mgr.sheet_entries[sheet_name].remove(entry)
        
        # 销毁框架
        frame.destroy()
        
        # 更新配置数据
        self.config_mgr.update_config_data()
    
    def add_current_config_entry(self):
        """为当前活跃的标签页添加配置项"""
        self.add_config_entry()
    
    # ========================
    # 文件操作相关方法
    # ========================
    
    def auto_load_default_config(self):
        """自动加载本地的 test_config.xlsx 文件"""
        default_file = os.path.join(os.path.dirname(__file__), "test_config.xlsx")
        
        if not FileHandler.file_exists(default_file):
            return
        
        try:
            # 加载Excel文件
            workbook, sheet_names = FileHandler.load_excel_file(default_file)
            if not workbook or not sheet_names:
                return
            
            # 清空现有数据
            self.clear_all_sheets()
            self.config_mgr.config_data = {}
            self.config_mgr.sheets_data = {}
            
            # 为每个工作表创建标签页并加载数据
            for sheet_name in sheet_names:
                worksheet = workbook[sheet_name]
                
                # 创建标签页
                self.add_sheet(sheet_name)
                
                # 读取并添加配置项
                config_list = FileHandler.read_sheet_data(worksheet)
                for config_item in config_list:
                    self.add_config_entry(
                        sheet_name=sheet_name,
                        name=config_item["name"],
                        value=config_item["value"]
                    )
                    
                    # 保存到全局配置数据
                    full_name = f"[{sheet_name}] {config_item['name']}"
                    self.config_mgr.config_data[full_name] = {
                        "value": config_item["value"],
                        "sheet": sheet_name
                    }
            
            workbook.close()
            self.config_mgr.update_config_data()
            
        except Exception as e:
            print(f"自动加载配置文件失败: {e}")
            try:
                if 'workbook' in locals():
                    workbook.close()
            except:
                pass
    
    def load_config(self):
        """从Excel文件加载配置"""
        file_path = FileHandler.get_open_file_path()
        
        if not file_path or not FileHandler.file_exists(file_path):
            return
        
        try:
            # 加载Excel文件
            workbook, sheet_names = FileHandler.load_excel_file(file_path)
            if not workbook or not sheet_names:
                return
            
            # 清空现有数据
            self.clear_all_sheets()
            self.config_mgr.config_data = {}
            self.config_mgr.sheets_data = {}
            
            # 为每个工作表创建标签页并加载数据
            for sheet_name in sheet_names:
                worksheet = workbook[sheet_name]
                
                # 创建标签页
                self.add_sheet(sheet_name)
                
                # 读取并添加配置项
                config_list = FileHandler.read_sheet_data(worksheet)
                for config_item in config_list:
                    self.add_config_entry(
                        sheet_name=sheet_name,
                        name=config_item["name"],
                        value=config_item["value"]
                    )
                    
                    # 保存到全局配置数据
                    full_name = f"[{sheet_name}] {config_item['name']}"
                    self.config_mgr.config_data[full_name] = {
                        "value": config_item["value"],
                        "sheet": sheet_name
                    }
            
            workbook.close()
            self.config_mgr.update_config_data()
            messagebox.showinfo("成功", f"已从以下文件加载配置:\n{file_path}")
            
        except Exception as e:
            messagebox.showerror("错误", f"加载文件失败:\n{str(e)}")
    
    def save_config(self):
        """保存配置到Excel文件"""
        if not self.config_mgr.config_data:
            messagebox.showwarning("警告", "没有配置数据可保存！")
            return
        
        file_path = FileHandler.get_save_file_path()
        
        if not file_path:
            return
        
        # 转换数据格式用于保存
        sheets_data = {}
        for sheet_name, config_list in self.config_mgr.sheets_data.items():
            sheets_data[sheet_name] = [
                {"name": name, "value": config["value"]}
                for name, config in config_list.items()
            ]
        
        FileHandler.save_excel_file(file_path, sheets_data)
    
    def clear_config(self):
        """清空所有配置"""
        if messagebox.askyesno("确认", "确定要清空所有配置吗？"):
            self.clear_all_sheets()
            self.config_mgr.clear_all()
    
    # ========================
    # 代码生成相关方法
    # ========================
    
    def generate_c_header(self):
        """生成C语言头文件"""
        self.config_mgr.update_config_data()
        CodeGenerator.export_c_header(self.config_mgr.config_data, 
                                     self.config_mgr.sheets_data)


def main():
    """程序主入口"""
    root = tk.Tk()
    app = CConfigGUI(root)
    root.mainloop()


if __name__ == "__main__":
    main()
